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