1. 程式人生 > >JM程式碼分析(一)

JM程式碼分析(一)

原文轉自:http://blog.csdn.net/tanxuan231/article/details/44887073

入門視訊採集與處理(學會分析YUV資料)

核心編碼函式研究

如果選擇的是幀內模式,則預測值由當前幀已經編碼重建的巨集塊(沒有經過去塊效應濾波器)給出,最佳的模式值經過熵編碼輸出到編碼流。如果選擇的是幀間模式,則預測值由以前編碼幀的重建影象給出,選擇的參考幀運動向量等資訊經過熵編碼輸出到碼流。原始影象的值和幀內或者幀間預測得到的預測值相減得到殘差資料,這些殘差資料經過變換,量化後得到的殘差係數也經過熵編碼輸出到碼流。另外,參加熵編碼的殘差係數經過反量化和反變換,和預測值相加,得到重建巨集塊,儲存在當前幀的重建影象中。當前幀的重建影象全部完成以後,經過去塊效應濾波器的濾波,將作為參考幀儲存起來成為以後編碼影象的幀間運動估計的參考。

編碼一個巨集塊的步驟: 
幀間幀內模式選擇,7 種幀間模式包括:16x16 16x8 8x16 8x8 8x4 4x8 4x4, 分別對應模式編號1~7。在進行幀間預測的時候,只有在選擇了把一個巨集塊劃分成4 個8x8 的塊之後,才能進一步選擇8x4,4x8 和4x4的分塊。因此,在JM 模型中,把4~7 的四種幀間模式統稱為P8x8。根據配置檔案中的RDOptimization 的取值,JM 採用兩套不同的編碼步驟。

核心全域性變數

<code class="hljs markdown has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">static const short part_size[<span class="hljs-link_label" style="box-sizing: border-box;">8</span>][<span class="hljs-link_reference" style="box-sizing: border-box;">2</span>] = 
{
  {4, 4},
  {4, 4},
  {4, 2},
  {2, 4},
  {2, 2},
  {2, 1},
  {1, 2},
  {1, 1}
};</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

SKIP模式,16×16,16×8,8×16,P8×8(8x8, 8x4, 4x8, 4x4),以一個4x4大小為基礎。

運動向量的寫碼流

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">int main()
{
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// init encoder</span>
  init_encoder(p_Enc<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>p_Vid, p_Enc<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>p_Inp);

  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// encode sequence</span>
  encode_sequence(p_Enc<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>p_Vid, p_Enc<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>p_Inp);
}

encode_sequence <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>encode_one_frame
encode_sequence  <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>encode_one_redundant_frame <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>encode_one_frame

encode_one_frame(VideoParameters <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>p_Vid, InputParameters <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>p_Inp)
{
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (p_Inp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>PicInterlace <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> FIELD_CODING)
    <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>perform_encode_field<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>(p_Vid);
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
    <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>perform_encode_frame<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>(p_Vid);
}

perform_encode_frame <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>frame_picture_mp <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> 
    </span>frame_picture_mp_b_slice/frame_picture_mp_i_slice/frame_picture_mp_p_slice <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>frame_picture<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span> 
perform_encode_frame <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>frame_picture<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>

perform_encode_frame <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span>frame_picture<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">**</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>code_a_picture(p_Vid, frame);
perform_encode_field <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>field_picture <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>code_a_picture(p_Vid, top);/code_a_picture(p_Vid, bottom);

code_a_picture(VideoParameters <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>p_Vid, Picture <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>pic)
{
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>( (p_Inp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>separate_colour_plane_flag <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) )
  {
    for( pl<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; pl<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>MAX_PLANE; pl<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">++</span> )
    {
      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>current_mb_nr <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>current_slice_nr <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>SumFrameQP <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>num_ref_idx_l0_active <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>num_ref_idx_l1_active <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;

      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>colour_plane_id <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (char) pl;

      code_a_plane(p_Vid, p_Inp);
    }
  }
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
  {
    code_a_plane(p_Vid, p_Inp);
  }
}

code_a_plane
{
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (NumberOfCodedMBs <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span> p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>PicSizeInMbs)       <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// loop over slices</span>
  {
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Encode one SLice Group</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!</span>FmoSliceGroupCompletelyCoded (p_Vid, SliceGroup))
    {
      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Encode the current slice</span>
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!</span>p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>mb_aff_frame_flag)
        NumberOfCodedMBs <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> encode_one_slice (p_Vid, SliceGroup, NumberOfCodedMBs);
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
        NumberOfCodedMBs <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+=</span> encode_one_slice_MBAFF (p_Vid, SliceGroup, NumberOfCodedMBs);

      FmoSetLastMacroblockInSlice (p_Vid, p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>current_mb_nr);
      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Proceed to next slice</span>
      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>current_slice_nr<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">++</span>;
      p_Vid<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>p_Stats<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>bit_slice <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
    }
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Proceed to next SliceGroup</span>
    SliceGroup<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">++</span>;
  }
}
encode_one_slice <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>init_slice
encode_one_slice_MBAFF <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-> </span>init_slice
init_slice
{  
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>currSlice)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>symbol_mode <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span> CAVLC)
  {
    setup_cavlc(<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>currSlice, (<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>currSlice)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>listXsize);
  }
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
  {
    setup_cabac(<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>currSlice, (<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">*</span>currSlice)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>listXsize);
  }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li></ul>

運動向量是以1/4畫素為單位的,所以(4,8),實際代表偏移了(1,2)個畫素

PartitionMotionSearch

從碼流中提取NALU

從碼流中提取一個NALU的過程:get_ annex_ b_NALU 
對於一個原始的 H.264 NALU 單元常由 [Start Code] [NALU Header] [NALU Payload] 三部分組成, 其中 Start Code 用於標示這是一個 
NALU 單元的開始, 必須是 “00 00 00 01” 或 “00 00 01”, NALU 頭僅一個位元組, 其後都是 NALU 單元內容. 
打包時去除 “00 00 01” 或 “00 00 00 01” 的開始碼, 把其他資料封包的 RTP 包即可.

結構體

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> video_par  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//視訊引數結構  Image Parameters</span>
{
    InputParameters          *p_Inp;

    pic_parameter_set_rbsp_t *active_pps;
    seq_parameter_set_rbsp_t *active_sps;
    seq_parameter_set_rbsp_t SeqParSet[MAXSPS];
    pic_parameter_set_rbsp_t PicParSet[MAXPPS];
    pic_parameter_set_rbsp_t *pNextPPS;

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> framerate;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> frame_no;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> fld_type;                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< top or bottom field</span>

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>  key_frame;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>  frm_no_in_file;    

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> pix_x;                   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< current pixel horizontal</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> pix_y;                   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< current pixel vertical</span>

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//currentPicture指向當前正在活動的影象(frame_pic, top_pic或bottom_pic)</span>
    Picture       *currentPicture; 
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> slice  *currentSlice;     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< pointer to current Slice data struct</span>
    Macroblock    *mb_data;         <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< array containing all MBs of a whole frame</span>

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>  frameNuminGOP; 

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> num_mb_per_slice;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> number_of_slices;

    GOP_DATA *gop_structure;

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> p_dec;                      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< decoded image file handle</span>

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> nalu_t *nalu;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>
<code class="hljs d has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//! Slice</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">typedef</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> slice
{
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> video_par    *p_Vid;   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// pointer to the original video structure</span>
    InputParameters     *p_Inp;   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// pointer to the input parameters</span>

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>                 start_mb_nr;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>                 max_part_nr;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< number of different partitions</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>                 num_mb;       <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< number of MBs in the slice</span>

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>                 frame_no;

    MotionVector *****all_mv;         <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< replaces local all_mv</span>
    MotionVector ******bipred_mv;     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< Biprediction MVs </span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>

00000(IDR) 21392 28 37.638 41.571 43.231 391 0 FRM 3

<code class="hljs asciidoc has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-code" style="box-sizing: border-box;">-------------------------------------------------------------------------------
Frame     Bit/pic    QP   SnrY    SnrU    SnrV    Time(ms) MET(ms) Frm/Fld Ref  
-------------------------------------------------------------------------------</span>
00000(NVB)     320 
00000(IDR)   21392   28  37.638  41.571  43.231       391       0    FRM    3
00002( B )    5280   31  35.548  40.735  42.217      1368     689    FRM    1
<span class="hljs-header" style="box-sizing: border-box;">00001( B )    2096   32  35.308  41.128  42.611      1281     778    FRM    0
-------------------------------------------------------------------------------</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

image.c 
encode_ one_frame -> ReportNALNonVLCBits ReportFirstframe

buf2img_basic 將檔案中的一幀轉換為PIC

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> buf2img_basic (imgpel** imgX,            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< Pointer to image plane</span>
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">unsigned</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>* buf,       <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< Buffer for file output</span>
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size_x,               <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< horizontal size of picture</span>
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> size_y,               <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< vertical size of picture</span>
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> o_size_x,             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< horizontal size of picture output</span>
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> o_size_y,             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< vertical size of picture output</span>
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> symbol_size_in_bytes, <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< number of bytes in file used for one pixel  一個畫素所需的位元組數</span>
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dummy                 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//!< dummy variable used for allowing function pointer use</span>
                    )
{
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i,j;
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">unsigned</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>* temp_buf = buf;

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (symbol_size_in_bytes> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(imgpel))  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//sizeof(imgpel) = 2 byte =16bit</span>
  {
    error (<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Source picture has higher bit depth than imgpel data type. \nPlease recompile with larger data type for imgpel."</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>);
  }

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (( <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span> (imgpel) == symbol_size_in_bytes))
  {    
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// imgpel == pixel_in_file -> simple copy</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (size_x == o_size_x && size_y == o_size_y)
      <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memcpy</span>(&imgX[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>], temp_buf, size_x * size_y * <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(imgpel));
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
    {
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> iminwidth   = imin(size_x, o_size_x);
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> iminheight  = imin(size_y, o_size_y);
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dst_offset_x  = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, dst_offset_y = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> offset_x = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, offset_y = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// currently not used</span>

      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// determine whether we need to center the copied frame or crop it</span>
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ( o_size_x >= size_x ) 
        dst_offset_x = ( o_size_x  - size_x  ) >> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;

      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (o_size_y >= size_y) 
        dst_offset_y = ( o_size_y - size_y ) >> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;

      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// check copied area to avoid copying memory garbage</span>
      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// source</span>
      iminwidth  =  ( (offset_x + iminwidth ) > size_x ) ? (size_x  - offset_x) : iminwidth;
      iminheight =  ( (offset_y + iminheight) > size_y ) ? (size_y - offset_y) : iminheight;
      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// destination</span>
      iminwidth  =  ( (dst_offset_x + iminwidth ) > o_size_x  ) ? (o_size_x  - dst_offset_x) : iminwidth;
      iminheight =  ( (dst_offset_y + iminheight) > o_size_y )  ? (o_size_y - dst_offset_y) : iminheight;

      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i<iminheight;i++) {
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memcpy</span>(&imgX[i + dst_offset_y][dst_offset_x], &(temp_buf[(i + offset_y) * size_x + offset_x]), iminwidth * <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(imgpel));
      }
    }
  }
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
  {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j_pos;
    uint16 ui16;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (size_x == o_size_x && size_y == o_size_y)
    {
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (j=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < o_size_y; j++) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//按行</span>
      {
        j_pos = j * size_x;  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//0*144;1*144;2*144....每行行首</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < o_size_x; i++)
        {
          ui16=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;             
          <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//行首+一行的偏移(i + j_pos) * symbol_size_in_bytes表示位元組數</span>
          <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memcpy</span>(&(ui16), buf + ((i + j_pos) * symbol_size_in_bytes), symbol_size_in_bytes);
          imgX[j][i]= (imgpel) ui16;
        }
      } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//@1 為解釋此for迴圈</span>
    }
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>
    {
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> iminwidth   = imin(size_x, o_size_x);
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> iminheight  = imin(size_y, o_size_y);
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> dst_offset_x  = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, dst_offset_y = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> offset_x = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, offset_y = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// currently not used</span>

      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// determine whether we need to center the copied frame or crop it</span>
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ( o_size_x >= size_x ) 
        dst_offset_x = ( o_size_x  - size_x  ) >> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;

      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (o_size_y >= size_y) 
        dst_offset_y = ( o_size_y - size_y ) >> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;

      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// check copied area to avoid copying memory garbage</span>
      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// source</span>
      iminwidth  =  ( (offset_x + iminwidth ) > size_x ) ? (size_x  - offset_x) : iminwidth;
      iminheight =  ( (offset_y + iminheight) > size_y ) ? (size_y - offset_y) : iminheight;
      <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// destination</span>
      iminwidth  =  ( (dst_offset_x + iminwidth ) > o_size_x  ) ? (o_size_x  - dst_offset_x) : iminwidth;
      iminheight =  ( (dst_offset_y + iminheight) > o_size_y )  ? (o_size_y - dst_offset_y) : iminheight;

      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < iminheight; j++) 
      {
        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memcpy</span>(&imgX[j + dst_offset_y][dst_offset_x], &(temp_buf[(j + offset_y) * size_x + offset_x]), iminwidth * symbol_size_in_bytes);
      }
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (j=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; j < iminheight; j++)
      {        
        j_pos = (j + offset_y) * size_x + offset_x;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (i=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; i < iminwidth; i++)
        {
          ui16 = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
          <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">memcpy</span>(&(ui16), buf + ((i + j_pos) * symbol_size_in_bytes), symbol_size_in_bytes);
          imgX[j + dst_offset_y][i + dst_offset_x]= (imgpel) ui16;
        }
      }    
    }
  }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li></ul>

@1: 
這裡寫圖片描述 
因此imgX這個二位數組裡存放了Y DATA的資料 
====================== Y Data ====================== 
+——————————–+——————————–+ 
| 49, 50, 49, 49, 49, 48, 48, 48,| 48, 49, 51, 57, 62, 62, 61, 62,| 
| 47, 47, 48, 48, 48, 48, 48, 47,| 47, 48, 48, 47, 48, 50, 50, 50,| 
| 45, 45, 45, 44, 45, 45, 46, 45,| 45, 45, 45, 44, 43, 43, 44, 44,| 
| 41, 42, 43, 43, 43, 41, 41, 43,| 43, 41, 42, 43, 43, 42, 43, 43,| 
| 38, 39, 38, 38, 39, 40, 39, 38,| 39, 39, 39, 40, 39, 38, 39, 38,| 
| 39, 39, 39, 38, 39, 41, 40, 40,| 40, 41, 41, 40, 40, 41, 42, 40,| 
| 51, 51, 52, 52, 51, 50, 51, 51,| 51, 50, 50, 50, 50, 50, 51, 50,| 
| 64, 64, 65, 64, 63, 62, 62, 62,| 62, 62, 62, 61, 61, 61, 60, 60,| 
+——————————–+——————————–+ 
| 73, 74, 74, 74, 73, 72, 70, 70,| 71, 71, 71, 70, 70, 70, 70, 70,| 
| 77, 79, 78, 78, 78, 77, 75, 75,| 76, 75, 75, 75, 75, 75, 75, 74,| 
| 79, 79, 79, 79, 78, 77, 76, 76,| 76, 75, 75, 75, 74, 74, 74, 74,| 
| 82, 81, 81, 80, 78, 76, 76, 76,| 76, 76, 75, 75, 75, 75, 75, 74,| 
| 93, 91, 87, 83, 80, 77, 76, 76,| 76, 76, 75, 74, 75, 76, 76, 76,| 
|105,102, 94, 86, 82, 78, 77, 76,| 76, 78, 76, 75, 76, 77, 77, 77,| 
|111,108, 99, 89, 82, 80, 77, 77,| 77, 78, 76, 75, 76, 76, 78, 77,| 
|117,111,102, 91, 82, 80, 78, 79,| 78, 77, 76, 76, 76, 77, 77, 76,| 
+——————————–+——————————–+: 
2、int read_one_frame (VideoParameters *p_Vid, VideoDataFile *input_file, int FrameNoInFile, int HeaderSize, FrameFormat *source, FrameFormat *output, imgpel **pImage[3]) 
pImage[3]存放了Y/U/V的資料 
這裡寫圖片描述

H.264級別Level、DPB 與MaxDpb Mbs 詳解

巨集塊模式

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> mb_mode_table[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>]  = 
{
    <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//16X16 Direct模式,在B幀中有效</span>
    <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, <span class="hljs-comment" style="color: rgb(136, 0, 0); bo